package com.mayo.feaf;

import java.util.ArrayList;
import java.util.List;

import org.apache.http.NameValuePair;
import org.apache.http.message.BasicNameValuePair;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import android.annotation.TargetApi;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Build;
import android.os.Bundle;
import android.support.v7.app.ActionBar;
import android.text.SpannableString;
import android.text.style.UnderlineSpan;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageButton;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

import com.mayo.feaf.comun.BaseActivity;
import com.mayo.feaf.comun.ComunActivity;
import com.mayo.feaf.comun.ComunUtilidades;
import com.mayo.feaf.json.JSONParser;
import com.mayo.feaf.object.AgrupacionObject;
import com.mayo.feaf.object.MarcadorObject;
import com.tjerkw.slideexpandable.library.SlideExpandableListAdapter;

@TargetApi(Build.VERSION_CODES.HONEYCOMB)
public class ListadoAgrupacionesActivity extends BaseActivity {

	private ListView listaAgrupaciones;
	public ListAdapter adapter;
	public JSONParser jParser = new JSONParser();
	public static JSONArray agrupaciones = null;
	public ProgressDialog pDialog;
	
	public final String TAG_SUCCESS = "success";
	public final String TAG_AGRUPACIONES = "grupos";
	public final String TAG_ID = "id";
	public final String TAG_CODIGO = "codigo_agrupacion";
	public final String TAG_NOMBRE = "nombre_agrupacion";
	public final String TAG_COMUNI = "nombre_comunidad";
	public final String TAG_PROVIN = "nombre_provincia";
	public final String TAG_CIUDAD = "Ciudad";
	public final String TAG_DIREC = "direccion_agrupacion";
	public final String TAG_TELEF = "telefono_agrupacion";
	public final String TAG_EMAIL = "email_agrupacion";
	public final String TAG_WEB = "web_agrupacion";
	public final String TAG_REPRES = "representante_agrupacion";
	public final String TAG_LATI = "latitud";
	public final String TAG_LONG = "longitud";
	
	private String comunidad;
	
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		
		setContentView(R.layout.activity_listado_agrupaciones);
		
		if (getIntent().getExtras() != null) {
			Bundle todosParametros = getIntent().getExtras();
			comunidad = todosParametros.getString("comunidad");
		}
		actionBar.setTitle(R.string.tit_listado);
		String nombreComunidad = ComunActivity.getComunidadFromId(Integer.parseInt(comunidad));
		actionBar.setSubtitle(nombreComunidad);
		actionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_TITLE
				| ActionBar.DISPLAY_SHOW_HOME | ActionBar.DISPLAY_HOME_AS_UP
				| ActionBar.DISPLAY_SHOW_CUSTOM);
		
		listaAgrupaciones = (ListView) findViewById(R.id.listado_agrupaciones);
		
		new LoadAllGrupos().execute(comunidad);
		
	  }
	
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
        case android.R.id.home:
            this.finish();
            return true;
        default:
            return super.onOptionsItemSelected(item);
        }
    }
	
	/**
	 * Background Async Task to Load all product by making HTTP Request
	 * */
	class LoadAllGrupos extends AsyncTask<String, String, String> {

		/**
		 * Before starting background thread Show Progress Dialog
		 * */
		@Override
		protected void onPreExecute() {
			super.onPreExecute();
			pDialog = new ProgressDialog(ListadoAgrupacionesActivity.this);
			pDialog.setMessage("Cargando el listado de agrupaciones. Por favor espere...");
			pDialog.setIndeterminate(false);
			pDialog.setCancelable(false);
			pDialog.show();
		}

		/**
		 * getting All products from url
		 * */
		protected String doInBackground(String... args) {
			String error = "0";
			List<NameValuePair> params;
			JSONObject json = new JSONObject();
			try {
				params = new ArrayList<NameValuePair>();
				params.add(new BasicNameValuePair("comunidad", args[0]));
				json = jParser.makeHttpRequest(ComunUtilidades.URL_GET_GRUPOS, "GET", params);
				Log.d("Todas las agrupaciones: ", json.toString());
				int success = json.getInt(TAG_SUCCESS);

				if (success == 1) {
					agrupaciones = json.getJSONArray(TAG_AGRUPACIONES);
					adapter = new ListAdapter(agrupaciones.length(),
							getApplicationContext());

					// looping through All Products
					for (int i = 0; i < agrupaciones.length(); i++) {
						JSONObject c = agrupaciones.getJSONObject(i);
						
						int id = c.getInt(TAG_ID);
						String cod = c.getString(TAG_CODIGO);
						String name = c.getString(TAG_NOMBRE);
						String comu = c.getString(TAG_COMUNI);
						String prov = c.getString(TAG_PROVIN);
						String ciud = c.getString(TAG_CIUDAD);
						String dire = c.getString(TAG_DIREC);
						String tele = c.getString(TAG_TELEF);
						String email = c.getString(TAG_EMAIL);
						String web = c.getString(TAG_WEB);
						String repre = c.getString(TAG_REPRES);
						String lati = c.getString(TAG_LATI);
						String longi = c.getString(TAG_LONG);
						
						AgrupacionObject agr = new AgrupacionObject(id, cod, name, comu, prov, ciud, dire, tele, email, web, repre, lati, longi);
						
						adapter.addItem(agr);
					}
				}
			} catch (JSONException e) {
				e.printStackTrace();
				error = "1";
			} catch (RuntimeException e) {
				e.printStackTrace();
				error = "1";
			}

			return error;
		}

		/**
		 * After completing background task Dismiss the progress dialog
		 * **/
		protected void onPostExecute(final String error) {
			// dismiss the dialog after getting all products
			pDialog.dismiss();
			// updating UI from Background Thread
			runOnUiThread(new Runnable() {
			 public void run() {
				if (error.equals("0")) {
//					listaAgrupaciones.setAdapter(adapter);
					listaAgrupaciones.setAdapter(
				            new SlideExpandableListAdapter(
				                adapter,
				                R.id.expandable_toggle_button,
				                R.id.expandable
				            )
				            );
				} else {
					Toast.makeText(getApplicationContext(), getString(R.string.error_conexion),
							Toast.LENGTH_LONG).show();
				}
			 }
			});

		}
	}
	
	/**
	 * Clase que controla el contenido y acciones de la lista de lugares.
	 * 
	 * @author masuar
	 * 
	 */
	public class ListAdapter extends BaseAdapter {
		public final ViewHolder holder = new ViewHolder();
		private ArrayList<AgrupacionObject> agrupaciones = new ArrayList<AgrupacionObject>();
		private LayoutInflater inflater;
		private Context context;
		
		public ListAdapter(int size, Context context) {
			inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
			this.context = context;
			inflater = LayoutInflater.from(context);
		}

		public void addItem(final AgrupacionObject lugar) {
			agrupaciones.add(lugar);
			notifyDataSetChanged();
		}

		@Override
		public int getCount() {
			return agrupaciones.size();
		}

		@Override
		public AgrupacionObject getItem(int position) {
			return agrupaciones.get(position);
		}
		
		public void setItem(int position, AgrupacionObject agrupacion) {
			agrupaciones.set(position, agrupacion);
		}

		@Override
		public long getItemId(int position) {
			return agrupaciones.get(position).getId();
		}

		@Override
		public View getView(final int position, View convertView,
				ViewGroup parent) {
			convertView = inflater.inflate(R.layout.list_agrupaciones, null);
			convertView.setClickable(true);
			
			holder.map = (ImageButton) convertView.findViewById(R.id.mapa);
			holder.share = (ImageButton) convertView.findViewById(R.id.share);

			// Obtenemos las referencias a los distintos controles
			holder.codigo = (TextView) convertView.findViewById(R.id.codigo);
			holder.nombre = (TextView) convertView.findViewById(R.id.nombre);
			holder.ciudad = (TextView) convertView.findViewById(R.id.ciudad);
			holder.dire = (TextView) convertView.findViewById(R.id.direccion);
			holder.tele = (TextView) convertView.findViewById(R.id.telefono);
			holder.email = (TextView) convertView.findViewById(R.id.email);
			holder.web = (TextView) convertView.findViewById(R.id.web);
//			holder.repre = (TextView) convertView.findViewById(R.id.);
			
			holder.codigo.setText(agrupaciones.get(position).getCodigo());
			holder.nombre.setText(agrupaciones.get(position).getNombre());
			holder.ciudad.setText(agrupaciones.get(position).getCiudad() + " (" 
			+ agrupaciones.get(position).getProvincia() + ") ");
			holder.dire.setText(agrupaciones.get(position).getDireccion());
			holder.tele.setText(agrupaciones.get(position).getTelefono());
			holder.email.setText(agrupaciones.get(position).getEmail());
			SpannableString contentEmail = new SpannableString(agrupaciones.get(position).getEmail());
			contentEmail.setSpan(new UnderlineSpan(), 0, contentEmail.length(), 0);
			holder.email.setText(contentEmail);
			holder.email.setOnClickListener(new OnClickListener() {
				
				@Override
				public void onClick(View v) {
					ComunActivity.sendemail(context, ((AgrupacionObject) getItem(position)).getEmail(), getString(R.string.email_asunto_feaf), "");
				}
			});
	    	
			SpannableString contentWeb = new SpannableString(agrupaciones.get(position).getWeb());
			contentWeb.setSpan(new UnderlineSpan(), 0, contentWeb.length(), 0);
			holder.web.setText(contentWeb);
			holder.web.setOnClickListener(new OnClickListener() {
				
				@Override
				public void onClick(View v) {
					ComunActivity.openBrowser(context, ((AgrupacionObject) getItem(position)).getWeb());
				}
			});
			
//			Acciones de los botones que se expanden
			holder.share.setOnClickListener(new OnClickListener() {
				
				@Override
				public void onClick(View v) {
					ComunActivity.shareVia(getApplicationContext(), 
							getResources().getString(R.string.compartir_conoces) 
							+ " '" 
							+ getItem(position).getNombre().toString()
							+ "'. " 
							+ getResources().getString(R.string.compartir_descarga));
				}
			});
			
			holder.map.setOnClickListener(new OnClickListener() {
				
				@Override
				public void onClick(View v) {
					AgrupacionObject agrupaciones = getItem(position);
					MarcadorObject marcador = new MarcadorObject(agrupaciones.getId(),
							agrupaciones.getNombre(), 
							agrupaciones.getDireccion(), 
							agrupaciones.getLatitud(), 
							agrupaciones.getLongitud());
					Intent intent = new Intent(getApplicationContext(), MapaActivity.class);
					Bundle contenedor=new Bundle();
					contenedor.putParcelable("marcador", marcador);
					intent.putExtras(contenedor);
					startActivity(intent);
				}
			});
			convertView.setTag(holder);
			return convertView;
		}

			// This is called when doInBackground() is finished
			public void onPostExecute(final Bundle result) {
				onPostExecute(result);
				 runOnUiThread(new Runnable() {
					 public void run() {
						 //get picture saved in the map + set
					 }
				 });
			}
	}

	public static class ViewHolder {
		private TextView codigo;
		private TextView nombre;
		private TextView ciudad;
		private TextView dire;
		private TextView tele;
		private TextView email;
		private TextView web;
		private TextView repre;
		private TextView lati;
		private TextView longi;
		private ImageButton map;
		private ImageButton share;
	}
	
}
